docs(skills): readonly is stripped from any non-system write, not only an UPDATE payload - #15382
docs(skills): readonly is stripped from any non-system write, not only an UPDATE payload#15382claude[bot] wants to merge 1 commit into
readonly is stripped from any non-system write, not only an UPDATE payload#15382Conversation
…y an update The published catalog told application authors that a non-system write has a readonly field stripped from an UPDATE payload. As of the 2026-09-03 ruling the engine applies the same strip on the create path, so the sentence understated the rule on exactly the write where an author is most likely to seed a protected column. Both files say 'any non-system write' now, and the automation skill names create_record beside update_record and the step warning that reports the drop. Paid inside the token ratchet by deleting 'silently' -- which the same ruling made false: the drop is reported through droppedFields and a step warning. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ARYe3yQTQCUFm5qPYNgKaJ
|
Cross-link: the code half of #14147 is #15395 — engine + metadata-protocol + lint + service-automation. It is draft, labelled The sentence these files now carry is pinned by that PR, not by prose: Generated by Claude Code |
维护者速读(skills 席代读,2026-09-05T13:3xZ;本 PR 属 spec 车道,其席位可更正)改了什么:两个已发布 skill(objectstack-data、objectstack-automation)各改一句话: 为什么改:这是你 9-3 裁定(选项 C「同意」)的文档半边——引擎侧已经在 风险与代价:只改文档措辞,token 上限内(data skill 反而少 5 个 token)。os-zhuang 24 小时前已批准,但它一直是草稿,没人翻 ready。CI 23 绿 / 20 跳过。 席位意见:建议翻 ready 并入队。 你要做的:点「ready」再「入队」(或让 os-zhuang 做)。 Generated by Claude Code |
Part of #14147 — the governed-prose half, landing separately by the ruling's own
instruction (comment 5522734749: the two
skills/**edits "are a governed surfaceand land as a separate draft PR requesting review from
os-zhuangandhotlong,human merge, cross-linked from the code PR").
⛔ Human merge. Not to be flipped ready, enqueued or auto-merged by an agent.
What changed, and why the old sentence is now false
The maintainer ruled on 2026-09-03 (option C, verbatim 「同意」, presented as
overturning their own 2026-07-24 "INSERT (all callers) exempt" row) that a static
readonlyfield is stripped from a non-system caller's INSERT payload insideengine.insert, by the samestripReadonlyFieldsthat already runs onengine.update. The published catalog described the strip as an UPDATE-payloadrule, which understated it on exactly the write where an author is most likely to
seed a protected column — a create.
skills/objectstack-data/SKILL.mdskills/objectstack-automation/SKILL.mdreadonlyfield from anupdate_recordpayload"readonlyfield from any non-system write —create_recordandupdate_recordalike … and the drop is named in the step's warnings"silentlyis deleted rather than reworded: the same ruling made it false. Anon-system create now reports the drop through
droppedFieldsand, in a flow,through the step's own warnings.
Ratchet accounting
New text is paid for by deleting text in the same file — never by re-wrapping.
skills/objectstack-data/SKILL.md(lines)skills/objectstack-automation/SKILL.md(lines)SKILL.md(lines)skills/objectstack-data/SKILL.md(tokens)skills/objectstack-automation/SKILL.md(tokens)The token ratchet is the one that gates (
check:skills-token-ratchet), and thedata skill is now 5 tokens under its ceiling rather than at it. An earlier draft
of this edit measured 10021 — 12 over — and was rewritten down rather than
granted a ceiling raise; ceilings here are shrink-only and MAINTAINER-ONLY.
Gates — per family, with exit codes
43 families derived from the actual change set with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, all runindividually. 40 exit 0, including every skills family:
check:pm-skill-ratchet0 ·check:skills-token-ratchet0 (run directly) ·check:skill-compatibility0 ·check:skill-frame-sync0 ·check:skill-identifier-liveness0 ·check:pm-governed-prose0 ·check:doc-authoring0 ·check:nul-bytes0 ·check:spec-changes0 ·check:partof-closing-keyword0 ·check:corpus-claim-drift0.Three did not measure, none of them a verdict on this diff:
check:doc-formula-expressions@objectstack/formulaunbuilt in this worktreecheck:react-declaration-paritycheck:published-readme-exportsdist/*.d.tsof packages this fresh worktree has not builtCI builds first and runs the farm exactly once, which is where these three get
their real reading.
Verification
The behaviour these two paragraphs now describe is pinned by the code PR, not by
prose:
packages/objectql/src/engine-insert-static-readonly-strip.test.ts(16cases, real ObjectQL) and
packages/services/service-automation/src/builtin/create-record-readonly-drop.test.ts(a real flow run whose
create_recordstep reports the drop, and whoserunAs: 'system'sibling still seeds the column).Generated by Claude Code